/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager;

import br.com.deployment.entidade.acesso.Grupo;
import br.com.deployment.entidade.acesso.Usuario;
import br.com.deployment.message.Msg;
import br.com.deployment.servico.GrupoServico;
import br.com.deployment.servico.UsuarioServico;
import br.com.deployment.util.JavaMailApp;
import br.com.deployment.utilitario.Sexo;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.model.DualListModel;

/**
 *
 * @author elyjr
 */
@ManagedBean
@ViewScoped
public class ManagerUsuario implements Serializable {

    @EJB
    private UsuarioServico usuarioServico;
    
    @EJB
    private GrupoServico grupoServico;
    private Usuario usuario;
    private String textostatus;
    private String nome;
    private String email;

    private DualListModel<Grupo> dualGrupo;
    private List<Grupo> gruposSelec;
    
    private String confirmaSenha;
    
    public ManagerUsuario() {
    }

    @PostConstruct
    public void init() {
        usuario = new Usuario();
        gruposSelec = new ArrayList<Grupo>();
        dualGrupo = new DualListModel<Grupo>(grupoServico.findAll(), gruposSelec);
    }

    public void reinit() {
        usuario = new Usuario();
    }

    public void clear() {
        usuario = new Usuario();
    }
    
    

    public Usuario getUsuario() {
        return usuario;
    }

    public DualListModel<Grupo> getDualGrupo() {
         dualGrupo = new DualListModel<Grupo>(grupoServico.findAll(), gruposSelec);
        return dualGrupo;
    }

    public void setDualGrupo(DualListModel<Grupo> dualGrupo) {
        this.dualGrupo = dualGrupo;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public String getConfirmaSenha() {
        return confirmaSenha;
    }

    public void setConfirmaSenha(String confirmaSenha) {
        this.confirmaSenha = confirmaSenha;
    }

    
    public String getTextostatus() {
        return textostatus;
    }

    public void setTextostatus(String textostatus) {
        this.textostatus = textostatus;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public SelectItem[] selectItemSexo() {
        SelectItem[] items = new SelectItem[Sexo.values().length];
        int i = 0;
        for (Sexo sexo : Sexo.values()) {
            items[i++] = new SelectItem(sexo);
        }
        return items;
    }

    public void salvar() {

        usuario.setGrupos(dualGrupo.getTarget());
        
        if (!usuario.getSenha().equals(confirmaSenha)) {
            Msg.messagemError("Senhas não Conferem");
        } else {
            if (usuario.getSenha().equals(confirmaSenha)) {
                usuarioServico.create(usuario);
            }
        }
    }


    public void redirect(String s) {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            usuario = new Usuario();
            context.getExternalContext().redirect(s);
        } catch (IOException ex) {
            Logger.getLogger(ManagerUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    
    public void RegistrarExecption(Exception ex) {
        Logger.getLogger(ManagerPaisEstadoCidade.class.getName()).log(Level.SEVERE, null, ex);
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(ex.getMessage()));
    }

    public void forgotPassword() {
        
        int valor = (int) (Math.random() * 500000);
        String letras = "abcdefghijlmnopqrstuvxz";
        Random random = new Random();
        
        String armazenaChaves = "";
        
        int index = -1;
        for (int i = 0; i < 8; i++) {
            index = random.nextInt(letras.length());
            armazenaChaves += letras.substring(index, index + 1);
        }
        
        try {
            usuario = usuarioServico.verificarUsuarioNome(nome);

            if (usuario.getLogin().equals(nome) && usuario.isStatus() == true
                    && usuario.getEmail().equals(email)) {
                
                    usuario.setDatacadastro(new Date());
                    System.out.println(armazenaChaves);

                    JavaMailApp.enviarChave(email, usuario.getLogin(), armazenaChaves);
                    usuarioServico.edit(usuario);
                    reinit();
                    Msg.messagemInfo("Senha enviada para e-mail");
                    reinit();
               
            } else {
                reinit();
                Msg.messagemInfo("Você não tem permissão para este Acesso, Entre em contato "
                        + " com seu Superior");

            }

        } catch (EJBAccessException erro) {
            Msg.messagemError("Acesso não permitido" + erro);
        } catch(NullPointerException ne){
            Msg.messagemError("Usuário não encontrado");
        }
    }

    public List<Usuario> completeUsuario(String query) {
        List<Usuario> suggestions = new ArrayList<Usuario>();
        List<Usuario> bd = new ArrayList<Usuario>();


        Usuario usuario = new Usuario();
        usuario.setNome(query);
        bd = usuarioServico.findUsuario(usuario);

        for (Usuario p : bd) {
            suggestions.add(p);
        }

        return suggestions;

    }
}
